package org.wupgame.util;

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class RedisLockUtil {
	private static final long EXPIRE_TIME = 30;
	
	@Resource
	private RedisTemplate<String, Object> redisTemplate;
	
	/**
	 * 尝试获取分布式锁
	 *
	 * @param lockKey 锁的键
	 *
	 * @return 获取锁成功返回true，失败返回false
	 */
	public boolean tryLock(
		String lockKey
		// 锁的键
	                      ) {
		try {
			// 使用Redis的setIfAbsent方法尝试获取锁
			// 如果键不存在，则设置键值对并设置过期时间
			Boolean result = redisTemplate
				.opsForValue()
				.setIfAbsent(
					lockKey,
					"locked",
					EXPIRE_TIME,
					TimeUnit.SECONDS);
			// 确保返回值是true，而不是null
			return Boolean.TRUE.equals(result);
		}
		catch (Exception e) {
			// 记录异常日志
			log.error(
				"error",
				e);
			// 发生异常时返回false
			return false;
		}
	}
	
	/**
	 * 解锁方法 根据锁的键值删除Redis中的锁
	 *
	 * @param lockKey 锁的唯一标识，用于指定要删除的锁
	 */
	public void unlock(String lockKey) {
		try {
			// 使用redisTemplate删除指定键的锁
			redisTemplate.delete(lockKey);
		}
		catch (Exception e) {
			// 捕获并记录异常信息
			log.error(
				"error",
				e);
		}
	}
}
